Repository navigation
Stage 2: described runs write manifest version "4" - #227
Merged
Merged
Conversation
A v0.4.0 reader skips keys it does not know, so it opened a run with an experiment_description and silently ignored it (Stage 2 design question 9, owner answer 9). A run manifest that carries experiment_description now has manifest_version "4"; undescribed runs keep "2" or "3" byte for byte. read_manifest and RunInputs.open read version 4 and refuse a mismatch in either direction (reader and writer share check_version). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Scma6W3LC11s3qjXHZuGDm
…scribed # Conflicts: # CHANGELOG.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A run manifest that carries
experiment_descriptionnow hasmanifest_version"4". Undescribed runs keep"2"or"3"byte for byte.read_manifestandRunInputs.openread version 4.experiment_descriptionis refused, and so is a version 1, 2 or 3 manifest with one. The writer and the reader sharecheck_version.content_sha256in every entry exactly whensettings.verify_contentis true.manifest_versionrow) and the CHANGELOG are updated.Why
Stage 2 design, question 9, owner answer 9 (2026-11-08): a v0.4.0 reader skips keys it does not know (
manifest.py:357-412), so it opened a described run and ignored the description. It would name channels by header, pair by folder name and never check masks. Older readers refuse an unknown version, so they now refuse described runs. This must land before the v0.5.0 tag.Regression evidence
New
tests/test_described_manifest_version.py(10 tests):"4"(with and withoutverify_content) and reads back throughread_manifestandRunInputs.open.v0.4.0tag throughtests/released_code.py. It refuses the"4"manifest withManifest version '4' is not supported, and still reads an undescribed manifest."2"or"3".On
main(source reverted, tests kept): 8 failed, 2 passed. The 2 that pass are the "undescribed run keeps its version" cases, which are expected to pass on both sides. With the change: 10 passed.tests/test_strict_manifest.pyused"4"as its "unknown later version". It now uses"5", and the expected message lists'1', '2', '3', '4'.Checks
python tools/check.py: ruff check and format clean, 4585 passed, 4 skipped, code rules clean. The 4 skips are environmental: 3 need a case-sensitive-name file system check (test_cli_log.py:165,test_folder_rules.py:201and:229) and 1 needs file modes to apply (test_discovery.py:665, running as root). The v0.4.0 parity suitetests/test_parity_v0_4_0.pypasses unchanged.manifest.pyis 599 lines (limit 600).Needs an owner decision
verify_contenttrue is version 4, not 3. I read the answer as "described means 4". Version 4 therefore carries the strict-content rule itself, and readers treat 2, 3 and 4 alike. If you want separate versions for described-and-fingerprint-only and described-and-strict, say so.🤖 Generated with Claude Code
https://claude.ai/code/session_01Scma6W3LC11s3qjXHZuGDm